package model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
public class TaskScheduler {
private int nrOfQueues;
private int nrOfTasksPerQueue, queueClose, timeClose, nrOfTasks, peakHour;
private List<Server> servers;
private ArrayBlockingQueue<Task> waitingQueue;
private Iterator<Server> iterator;
public TaskScheduler(int nrOfQueues, int nrOfTasksPerQueue, int queueClose, int timeClose) {
this.nrOfQueues = nrOfQueues;
this.nrOfTasksPerQueue = nrOfTasksPerQueue;
this.queueClose = queueClose;
this.timeClose = timeClose;
servers = new ArrayList<Server>(nrOfQueues);
waitingQueue = new ArrayBlockingQueue<Task>(100);
}
private boolean areServersFull() {
for (Server s : servers) {
if (s.getNrOfTasks() < nrOfTasksPerQueue) {
return false;
}
}
return true;
}
public int getPeakHour() {
return peakHour;
}
private void displayServers(List<Server> servers) {
iterator = servers.iterator();
int nrTasks = 0;
while (iterator.hasNext()) {
Server server = iterator.next();
nrTasks += server.getNrOfTasks();
System.out.println(server.getName());
Task[] t = server.getTasks();
System.out.println(server.getNrOfTasks());
for (Task task : t) {
System.out.println(task);
}
}
if (nrTasks > nrOfTasks) {
nrOfTasks = nrTasks;
peakHour = TaskGenerator.getCurrentTime();
}
}
private void verifyTimeToClose() {
if (TaskGenerator.getCurrentTime() == timeClose) {
Server serv = new Server(1);
Server s=null;
serv.setName("Server " + queueClose);
if (servers.contains(serv)) {
iterator = servers.iterator();
while (iterator.hasNext()) {
s = iterator.next();
if (s.getName().equals(serv.getName())) {
break;
}
}
Task[] tasks=s.getTasks();
for (Task t:tasks)
waitingQueue.add(t);
System.out.println(serv.getName() + " was closed.");
System.out.println("Waiting:" + waitingQueue.size());
servers.remove(serv);
}
}
}
private void distributeServers(Task task) {
verifyTimeToClose();
boolean fullServers = areServersFull();
if (servers.isEmpty() || ((servers.size() < nrOfQueues) && (fullServers))) {
Server server = new Server(nrOfTasksPerQueue);
servers.add(server);
server.addTask(task);
new Thread(server).start();
} else if (fullServers) {
waitingQueue.add(task);
} else {
Collections.sort(servers, new Comparator<Server>() {
@Override
public int compare(Server o1, Server o2) {
if (o1.getNrOfTasks() < o2.getNrOfTasks()) {
return -1;
} else if (o1.getNrOfTasks() > o2.getNrOfTasks()) {
return 1;
}
return 0;
}
});
if (waitingQueue.isEmpty()) {
servers.get(0).addTask(task);
} else {
try {
servers.get(0).addTask(waitingQueue.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
displayServers(servers);
}
public void addTask(Task task) {
distributeServers(task);
}
public Server[] getAllServers() {
Server[] serv = servers.toArray(new Server[servers.size()]);
return serv;
}
}